package com.example.acountingappliaction;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
 * 数据库帮助类：管理数据库创建、升级及用户表操作
 */
public class DBHelper extends SQLiteOpenHelper {
    // 数据库信息
    private static final String DB_NAME = "AccountBook.db"; // 数据库名
    private static final int DB_VERSION = 1; // 数据库版本号

    // 用户表信息
    public static final String TABLE_USER = "user"; // 表名
    public static final String USER_ID = "_id"; // 主键（自增）
    public static final String USER_NAME = "username"; // 用户名（唯一）
    public static final String USER_PASSWORD = "password"; // 密码

    // 创建用户表的SQL语句
    private static final String CREATE_TABLE_USER = "CREATE TABLE " + TABLE_USER + " (" +
            USER_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            USER_NAME + " TEXT NOT NULL UNIQUE, " + // 用户名唯一，避免重复注册
            USER_PASSWORD + " TEXT NOT NULL)";

    public DBHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }

    // 数据库首次创建时调用（创建表）
    @Override
    public void onCreate(SQLiteDatabase db) {
        // 创建用户表
        db.execSQL(CREATE_TABLE_USER);
    }

    // 数据库版本升级时调用（如新增表、修改字段）
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // 如果旧表存在，先删除（实际项目中需考虑数据迁移）
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_USER);
        // 重新创建表
        onCreate(db);
    }

    // ------------------------ 用户表操作方法 ------------------------

    /**
     * 注册用户（插入数据）
     * @param user 用户对象
     * @return 插入成功返回新记录的ID，失败返回-1
     */
    public long register(User user) {
        SQLiteDatabase db = getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(USER_NAME, user.getUsername());
        values.put(USER_PASSWORD, user.getPassword());

        // 插入数据（若用户名已存在，会因UNIQUE约束抛出异常，需在调用处捕获）
        long rowId = db.insert(TABLE_USER, null, values);
        db.close(); // 关闭数据库连接
        return rowId;
    }

    /**
     * 根据用户名查询用户
     * @param username 用户名
     * @return 用户对象（不存在则返回null）
     */
    public User queryUserByUsername(String username) {
        SQLiteDatabase db = getReadableDatabase();
        Cursor cursor = null;
        User user = null;

        try {
            // 查询指定用户名的记录
            cursor = db.query(
                    TABLE_USER,
                    new String[]{USER_ID, USER_NAME, USER_PASSWORD},
                    USER_NAME + " = ?",
                    new String[]{username},
                    null, null, null
            );

            // 若查询到结果，封装为User对象
            if (cursor.moveToFirst()) {
                int id = cursor.getInt(cursor.getColumnIndexOrThrow(USER_ID));
                String name = cursor.getString(cursor.getColumnIndexOrThrow(USER_NAME));
                String pwd = cursor.getString(cursor.getColumnIndexOrThrow(USER_PASSWORD));
                user = new User(name, pwd);
                user.setId(id);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (cursor != null) {
                cursor.close(); // 关闭游标
            }
            db.close(); // 关闭数据库连接
        }
        return user;
    }


    // 检查用户名是否存在
    public boolean isUsernameExists(String username) {
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.query("users", new String[]{"username"},
                "username = ?", new String[]{username}, null, null, null);
        boolean exists = cursor.getCount() > 0;
        cursor.close();
        return exists;
    }

    // 验证密码是否正确
    public boolean verifyPassword(String username, String password) {
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.query("users", new String[]{"password"},
                "username = ?", new String[]{username}, null, null, null);

        if (cursor.moveToFirst()) {
            String storedPassword = cursor.getString(cursor.getColumnIndexOrThrow("password"));
            cursor.close();
            return storedPassword.equals(password); // 实际项目中建议用加密存储
        }
        cursor.close();
        return false;
    }
    /**
     * 验证登录（用户名和密码匹配）
     * @param username 用户名
     * @param password 密码
     * @return 验证成功返回true，否则返回false
     */
    public boolean login(String username, String password) {
        User user = queryUserByUsername(username);
        // 若用户存在且密码匹配，返回true
        return user != null && user.getPassword().equals(password);
    }
}